home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / comm / uucp / AM114src.lha / writecontents.c < prev    next >
C/C++ Source or Header  |  1992-07-19  |  3KB  |  101 lines

  1. /*
  2.  *
  3.  *  AM --- AmigaMail
  4.  *  (C) 1991, 1992 by Christian Riede
  5.  *
  6.  *  AM is distributed in the hope that it will be useful, but WITHOUT ANY
  7.  *  WARRANTY.  No author or distributor accepts responsibility to anyone
  8.  *  for the consequences of using it or for whether it serves any
  9.  *  particular purpose or works at all, unless he says so in writing.
  10.  *  Refer to the GNU General Public License, Version 1, for full details.
  11.  *  
  12.  *  Everyone is granted permission to copy, modify and redistribute AM,
  13.  *  but only under the conditions described in the GNU General Public
  14.  *  License, Version 1.  A copy of this license is supposed to have been 
  15.  *  given to you along with AM so you can know your rights and responsi-
  16.  *  bilities.  It should be in a file named COPYING.  Among other things,
  17.  *  the copyright notice and this notice must be preserved on all copies.
  18.  *
  19.  *  
  20.  *
  21.  */
  22.  
  23. #include "am.h"
  24. #include "server.h"
  25.  
  26. /* write contents into UUMAIL:<username>.mail/contents */
  27. int WriteContents(char *username,struct List *Mailbox,struct Strings *Strings)
  28. {
  29.     struct ContentsItem Actual;
  30.     BPTR Contents;
  31.     char ContentsName1[160];
  32.     char ContentsName2[160];
  33.     struct Mail *Mail;
  34.  
  35.     /* build name of new contents file */
  36.     sprintf(ContentsName1,"uumail:%s.mail/contents.new",username);
  37.  
  38.     /* open contents file */
  39.     if (!(Contents = Open((UBYTE *)ContentsName1,MODE_NEWFILE)))
  40.         return(FALSE);
  41.  
  42.     if (!(WriteStrings(Contents,Strings)))
  43.     {
  44.         Close(Contents);
  45.         return(FALSE);
  46.     }
  47.  
  48.     /* write contents file */
  49.     while (Mail = (struct Mail *)RemTail(Mailbox))
  50.     {
  51.         Actual.Number = Mail->Number;
  52.         Actual.FromNumber = GetNumber(Mail->From,FALSE,Strings);
  53.         Actual.ToNumber = GetNumber(Mail->To,FALSE,Strings);
  54.         Actual.ReplyToNumber = GetNumber(Mail->ReplyTo,FALSE,Strings);
  55.         Actual.SubjectNumber = GetNumber(Mail->Subject,FALSE,Strings);
  56.         Actual.MsgIdNumber = GetNumber(Mail->MsgId,FALSE,Strings);
  57.         Actual.InReplyToNumber = GetNumber(Mail->InReplyTo,FALSE,Strings);
  58.         Actual.Date = Mail->Date;
  59.         Actual.read = Mail->read;
  60.         
  61.         /* use buffered IO */
  62.  
  63.         if (FWrite(Contents,&Actual,1,sizeof(struct ContentsItem))!=
  64.             sizeof(struct ContentsItem))
  65.         {    
  66.             Close(Contents);
  67.             return(FALSE);
  68.         }
  69.  
  70.         /* free it */
  71.         FreeMail(Mail);
  72.     }
  73.  
  74.     /* close contents file */
  75.     Close(Contents);
  76.  
  77.     /* free strings */
  78.     FreeStrings(Strings);
  79.  
  80.     /* build name of old contents file */
  81.     sprintf(ContentsName1,"uumail:%s.mail/contents.old",username);
  82.  
  83.     /* delete it */
  84.     DeleteFile((UBYTE *)ContentsName1);
  85.     
  86.     /* build name of actual contents file */
  87.     sprintf(ContentsName2,"uumail:%s.mail/contents",username);
  88.  
  89.     /* rename actual as old */
  90.     Rename((UBYTE *)ContentsName2,(UBYTE *)ContentsName1);
  91.  
  92.     /* build name of new contents file */
  93.     sprintf(ContentsName1,"uumail:%s.mail/contents.new",username);
  94.  
  95.     /* rename new as actual */
  96.     Rename((UBYTE *)ContentsName1,(UBYTE *)ContentsName2);
  97.  
  98.     return(TRUE);
  99. }
  100.  
  101.